#include <stdio.h>
#include <stdlib.h>

void swap(int *, int *); // 函数参数采用传地址值的方式

/*
传递地址值是直接使用实参的地址，所以也就没有复制值的过程。

这是两者的关键性区别，也是传递效率不一样的原因。

*/
void main()
{
    int a = 55, b = 66;
    printf("&a=%#p\t &b=%#p\n", &a, &b); // 实参地址
    swap(&a, &b);                        // 传地址值
    printf("返回后数据：a=%d, b=%d\n", a, b);
    system("pause");
}

void swap(int *p, int *t)
{
    int temp;
    printf("&p=%#p\t &t=%#p\n", &p, &t); // 指针地址
    printf(" p=%#p\t t=%#p\n", p, t);    // 形参地址
    temp = *p;                           // 交换两个变量的值
    *p = *t;
    *t = temp;
    printf("交换数据为：a=%d, b=%d\n", *p, *t);
}

/*
C语言的函数参数要求必须是一个具有确定值的表达式，
也就是传递的是函数参数的值形式，称为传值。

这种值有两类：数值和地址值。
因为两者都是“值”，所以说C语言传递参数只有传值一种方式。

传数值是将实参的数值传递给形参
    形参拥有实参的一个备份，当在函数中改变形参的值时，
    改变的是这个备份中的值，不会影响原来实参的值。


将变量作为参数传递时，是传数值方式，可以在被调函数使用这些变量的值，但不会改变原来变量的值。
将指向参数的指针作为参数传递，则传递的是参数的地址值。因为传递的是参数的地址值，所以就是传递实参本身。
*/